iT邦幫忙

2023 iThome 鐵人賽

0
自我挑戰組

Django系列 第 22

Day22~Django 漫漫長路- 如何使用api來達到異步任務執行task

  • 分享至 

  • xImage
  •  

大家好,我是Leo
今天要來講解是如何透過API啟動一分鐘後的TASK任務/images/emoticon/emoticon30.gif
OK~~~ Let's go now!!!


tasks.py

首先我們有一個任務如下,return finish + 參數id

@shared_task()
def get_id(id):
    return 'finish:' + str(id)

views.py

這邊時區可以因應設置的celery的時區,我這邊是台北時區

import requests,os,pytz,datetime
from website.tasks import get_id
from celery import Celery
from rest_framework.response import Response
from rest_framework import permissions, views, status

class testAsyncTask(views.APIView):
    permission_classes = (permissions.AllowAny,)
    authentication_classes = []
    def post(self,request):
        id = request.data.get('id')

        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
        app = Celery("mysite")
        app.config_from_object("django.conf:settings", namespace="CELERY")
        app.autodiscover_tasks()

        local_timezone = pytz.timezone("Asia/Taipei")
        now = datetime.datetime.now()
        # 60秒後執行
        exec_time = now + datetime.timedelta(seconds=60)
        # 利用 pytz 進行轉換
        exec_time = local_timezone.localize(exec_time)
        
        #apply_async 異步執行,多進程安排執行任務,eta時間差,這邊是60秒後執行
        get_id.apply_async(args=(id,), eta=exec_time)

        return Response( {"success": True, "message": "執行成功"}, status=status.HTTP_200_OK)

urls.py

path('api/testTask',csrf_exempt(testAsyncTask.as_view()),name='api-testTask'),

啟動celery

很重要記得要先啟動celery,不然任務不會執行也不會啟動

celery -A mysite beat
# 這邊concurrency 選擇自己要執行的cpu核心數
Celery -A mysite worker --concurrency=4 -l info -P eventlet

postman

https://ithelp.ithome.com.tw/upload/images/20230530/201548538CWmvb6JC4.png


進去後台管理觀看任務執行狀況

  1. http://127.0.0.1:8000/admin/
  2. 點選Task results
  3. 查看剛剛的任務紀錄

https://ithelp.ithome.com.tw/upload/images/20230530/20154853aq7RAp3vu9.png

看到畫面恭喜執行成功
為什麼要執行多進程的異步方法呢?
每當我們執行api,任務就會佇列在任務時程上面
等到時間到,就會執行呼叫相關的任務內容
與此同時API不會因為任務還沒執行而一直處於等待的階段


今天主要講解執行API來達成多進程異步任務的佇列,接下來我們來講解Redis的快取使用方式
我們明天見,各位掰掰~~~/images/emoticon/emoticon29.gif


上一篇
Day21~Django 漫漫長路- 油條配豆漿,Celery配Redis part2
下一篇
Day23~Django 漫漫長路- 快取儲存法寶Redis
系列文
Django30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言